//
//  EZCDataBase.h
//  sqlitepersistentobjectsTest
//
//  Created by ellzu on 13-7-30.
//  Copyright (c) 2013年 ellzu. All rights reserved.
//

#ifndef __sqlitepersistentobjectsTest__EZCDataBase__
#define __sqlitepersistentobjectsTest__EZCDataBase__

#include <iostream>
#include <sqlite3.h>
#include <vector>
#include "EZCDBObject.h"
#include "EZCDBTestModel.h"
#include "EZCDBTableInfo.h"
#include "Factory.h"
#include "EZCDBFieldInfo.h"
#include "EZCDBDefine.h"
#include "EZTallyObject.h"
#include "EZTallyArray.h"
#include "EZTallyAutoPtr.h"

namespace EZCDBNS {
    
    class EZCDataBase : public EZTally::EZTallyObject
    {
        
    private:
        sqlite3 *_database;//数据炳
        std::string _filePatch;//数据库路径
        std::map<std::string,EZCDBTableInfo*> tableMap;//数据库表与类之间的影射信息
        
        int CloseDatabase();//关闭
        int OpenDatabase();//打开数据库
        
        void CreateDBTable(EZCDBTableInfo*);//创建数据表
        std::string MakeWhereString(EZCDBObject *object,bool fuzzy =false);//生成条件语句
        int RemoveObjectWithWhereStr(const std::string &tableName,const std::string &wheresql,int *delRow=0);//删除数据
    protected:
        ~EZCDataBase();
    public:
        EZCDataBase();
        
        
        int setDataBaseFilePath(const std::string &filePatch);//设置数据库路径
        std::string getDataBaseFilePath();//获取当前数据库路径
        sqlite3* databaseHandel();//获取数据库句炳
        
        void RegistTable(EZCDBTableInfo *tableInfo);//注册要影身数据库的类
        
        int SaveObject(EZCDBObject *object);//保存对像
        //查找对像　
        EZTally::EZTallyAutoPtr FindObjectsOne(EZCDBObject *fobject,int *errorCode=0,bool fuzzy =false);
        //查找对像 <EZCDBObject*>
        EZTally::EZTallyArray FindObjects(EZCDBObject *fobject,int maxcount,int *errorCode=0,bool fuzzy =false);
        //移除对像
        int RemoveObject(EZCDBObject *object,int *delRow=0,bool fuzzy =false);
        //清空数据表
        int ClearTable(const std::string &tableIdName,int *delRow=0);
        //获取影射信息 idName 为 typeid(Model).name()
        EZCDBTableInfo* TableInfoWithIdName(const std::string &idName);
    };
    
}

#endif /* defined(__sqlitepersistentobjectsTest__EZCDataBase__) */
